package com.tony.juc;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * Created with IntelliJ IDEA.
 *
 * @Title: CompletableFutureDemo001
 * @Auther: 皮蛋布丁
 * @Date: 2022/04/13/14:11
 * @Description: 异步操作
 */
public class CompletableFutureDemo001 {

    public static void main(String[] args) throws InterruptedException {

        /*CompletableFuture<String> future = new CompletableFuture<>();
        //下面利用多线程的概念模拟一个炮兵打炮的形式，因为所有的操作都需要有统一的口令
        for (int i = 0; i < 2; i++) {
            new Thread(()->{
                System.out.printf("【START】%s，炮兵就位，等待开炮命令发出。%n", Thread.currentThread().getName());
                try { // get()方法未收到数据则持续阻塞，收到数据则解除阻塞
                    System.err.printf("〖END〗%s，解除阻塞，收到执行命令：%s%n", Thread.currentThread().getName(), future.get());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }, "炮兵 - " + i).start();
        }
        TimeUnit.SECONDS.sleep(2); // 准备的模拟延迟
        future.complete("开炮");*/


        CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
            System.err.println("【*** 异步线程 ***】突然接到了上将军的紧急联系电话。");
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } // 当此异步线程执行完成之后，才会让所有的子线程恢复执行
            System.err.println("【*** 异步线程 ***】接到了新的作战任务，更改炮兵的作战目标。");
        }); // 异步线程不用考虑返回值了
        // 下面利用多线程的概念模拟一个炮兵打跑的形式，因为所有的操作都需要有统一的口令
        for (int x = 0; x < 2; x++) {
            new Thread(()->{
                System.out.printf("【START】%s，炮兵就位，等待开炮命令发出。%n", Thread.currentThread().getName());
                try { // get()方法未收到数据则持续阻塞，收到数据则解除阻塞
                    future.get(); // 异步的操作是没有返回结果的
                    System.err.printf("〖END〗%s，收到开火命令，万炮齐鸣。%n", Thread.currentThread().getName());
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }, "炮兵 - " + x).start();
        }
        System.out.println("【★主线程★】所有的炮兵线程进入到了就绪状态，等待后续命令的发送。");


    }
}
